package com.errol.generic.baiducloud.faceai;

import com.renjia.service.generic.baiducloud.faceai.pojo.faceliveness.*;
import com.renjia.service.generic.baiducloud.faceai.pojo.personverify.*;
import org.springframework.lang.Nullable;

import java.io.File;
import java.util.List;

/**
 * 百度人脸活体检测
 *
 * @author zhang xiao bin
 * @version v1.0
 * @date 2021/03/24
 * @since v5.1.0
 **/
public interface BaiduFaceAiService {

    /**
     * 获取校验码式活体检测所需的数字随机码
     *
     * @param verifyType    验证类型，语音或动作
     * @param codeMinLength 随机码最小长度，最小为 3
     * @param codeMaxLength 随机码最大长度，最大为 6
     * @return Result 数字随机码和百度会话id，需要缓存，或 null 表示获取失败
     */
    @Nullable
    BaiduFaceCodeResultDTO.Result getLivenessCode(BaiduFaceVerifyType verifyType, int codeMinLength, int codeMaxLength);

    /**
     * 调用百度活体视频验证
     *
     * @param verifyType      验证类型，语音或动作
     * @param videoFile       视频文件
     * @param livenessCode    getLivenessCode 返回值对象
     * @param verifyLipType   唇语检测类型，当前建议 OFF 关闭
     * @param verifyFieldType 是否检测合成图，当前必须开启
     * @return 验证结果
     */
    BaiduFaceVerifyResultDTO verifyFaceLiveness(BaiduFaceVerifyType verifyType, File videoFile, BaiduFaceCodeResultDTO.Result livenessCode,
                                                BaiduFaceVerifyLipType verifyLipType, BaiduFaceVerifyFieldType verifyFieldType);

    /**
     * 百度身份证验证 V2 版
     *
     * @param imageBase64        图片 base64 字符串
     * @param idCardNumber       身份证号
     * @param personName         人员姓名
     * @param checkPersonQuality 是否检测人脸照片质量
     * @param checkFaceLiveness  是否对人脸照片进行活体检测
     * @param fieldTypes         获取额外返回值，可以多选，半角逗号分割，不需要时传 null
     * @return 验证结果
     */
    BaiduPersonVerifyV2ResultDTO verifyPersonFaceV2(String imageBase64, String idCardNumber, String personName, boolean checkPersonQuality,
                                                    boolean checkFaceLiveness, List<BaiduPersonVerifyV2FieldType> fieldTypes);

    /**
     * 百度身份证验证 V3 版
     *
     * @param imageType           image 参数的类型
     * @param image               根据 imageType 传对应的值
     * @param idCardNumber        身份证号
     * @param personName          姓名
     * @param qualityControlType  人脸图片质量控制；默认 NONE 不控制
     * @param livenessControlType 活体验证控制，要求越高，攻击拒绝率越高，通过率越低；默认 NONE 不控制
     * @param spoofingControlType 合成图检测控制，要求越高，攻击拒绝率越高，通过率越低；默认 NONE 不控制
     * @return 验证结果
     */
    BaiduPersonVerifyV3ResultDTO verifyPersonFaceV3(BaiduPersonVerifyV3ImageType imageType, String image, String idCardNumber, String personName,
                                                    BaiduPersonVerifyV3ControlType qualityControlType, BaiduPersonVerifyV3ControlType livenessControlType,
                                                    BaiduPersonVerifyV3ControlType spoofingControlType);
}
